function Person() {

}
Person.prototype.name = 'sam'   //给构造函数的原型设置属性
let person1 = new Person()
console.log(person1.name)   //对象本身没有这个属性自动读取原型上的属性
person1.name = 'tony'
console.log(person1.name)
delete person1.name
console.log(person1.name)   //原型上的属性
console.log(person1.hasOwnProperty('name')) //false，自身没有name属性
console.log('name' in person1)  //true，自身和原型中至少有一个name属性。
console.log(person1.__proto__ === Person.prototype) //true，每一个js对象(除null)都有原型__proto__,指向该对象的原型
console.log(person1.__proto__.constructor === Person) //true， 每个原型都有一个constructor属性指向该对象的构造函数
console.log(Person === Person.prototype.constructor)   //true，
console.log(person1.constructor === Person.prototype.constructor) //true，person1没有constructor属性，实际上读取的是person1.__proto__也就是Person.prototype上面的constructor
console.log(Person.prototype.__proto__ === Object.prototype)    //Person.prototype为对象，实例对象的__proto__ === 构造函数的prototype
let obj = {}
console.log(obj.__proto__ === Object.prototype)
console.log(Person.prototype.__proto__ === obj.__proto__)
console.log(Object.prototype.__proto__ === null)    //相互关联的的原型组成原型链，图例（蓝色为原型链）https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f037949c811f4f06b96f4482021bfb3a~tplv-k3u1fbpfcp-zoom-1.image